h1b_df <- DATA

SECTION 1: BACKGROUND

SLIDE 7: MAP

htmltools::includeHTML("rMaps.html")

SECTION 2: STEM

SLIDE 9: Stem and non-stem histogram

DATA %>%
  group_by(year, stem) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
  geom_bar(stat = "identity", position = position_stack(reverse = FALSE), alpha = 0.8) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  labs(y="Number", x="\n Year") + 
  scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) + 
  theme_minimal() + 
  theme(plot.title = element_text(hjust=0.5)) +
  theme(legend.position = "top")

SLIDE 10: STEM and non-STEM boxplot: “Prevailing wage boxplot throughout years”

DATA %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
  ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
  geom_boxplot(aes(fill=as.factor(stem)), outlier.shape = NA, alpha=0.9, color = "white") +
  theme_minimal() +
 labs(x = "\n Prevailing wage ($)", y = "Density \n") +
  scale_y_continuous(labels = function(x){paste0(x / 1000, "K")}) +
  scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  coord_cartesian(ylim = c(40000, 100000))

SLIDE 11: Stem and non-stem prevailing wage distribution in 2018

DATA %>%
  filter(year == 2018) %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>% 
  ggplot(aes(x = prevailing_wage, color = as.factor(stem), fill = as.factor(stem))) +
  geom_density(adjust = 2, alpha = 0.7)+
  theme_classic() +
  labs(x = "\n Prevailing wage ($)", y = expression(Density~(10^{-3})), title = "Distribution of prevailing wage in 2018") +
  scale_x_continuous(labels = function(x){paste0(x/1000, 'K')}) +
  scale_y_continuous(labels = function(x){paste0(x * 1000, "")}) +
  scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  theme(plot.title = element_text(hjust=0.5))

SLIDE 12 AND 13: bar plot: stem jobs

dt <- DATA %>% 
  mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "senior systems analyst jc60"), "senior systems analyst", job_title)) %>% 
  filter(stem == 1)
# 
# dt %>% 
#   filter(year == 2017) %>% 
#   group_by(job_title) %>% 
#   summarise(n = n()) %>%
#   arrange(-n) %>% 
#   slice(1:20) %>% 
#   mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
#   arrange(n) %>% 
#   ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
#   labs(y = "Number of Aplications", x = "Job Titles")

dt %>% 
  filter(year == 2018) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
  arrange(n) %>% 
  ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
  labs(y = "Number of Aplications", x = "Job Titles")+
  theme(
    legend.position = "none"
  )



# original
dt %>% 
  filter(year == 2018) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
  arrange(n) %>% 
  ggbarplot("job_title", "n", fill = "#00B2E4", alpha = 0.8, orientation = "horiz", color = "white") +
  labs(y = "Number of Aplications", x = "Job Titles")

Slide 15

dt <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Engineer","Data Analyst", "Data Scientist")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  arrange(-n) 

p1 <- dt %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2)+
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "Applications Data related jobs", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") + 
  theme_minimal() +
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))
p1

Slide 17


top_com <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")) %>%
  group_by(employer_name) %>% 
  summarise(n = n()) %>% 
  arrange(-n) %>% 
  slice(1:20) %>% 
  ungroup()

top_com <-top_com$employer_name 

spa_data <- DATA %>% 
  filter(employer_name %in% top_com) %>% 
  filter(employer_name != "capgemini america inc") %>% 
  filter(data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")) %>%
  group_by(employer_name, year) %>% 
  summarise(n = n()) 

con=c("infosys limited", "deloitte consulting llp","amazon","facebook", "ibm")
myColor <- c("#465881", "#FFB6C1", "#00909e", "#00B2E4", "#FC2967")

# c(amazon, "deloitte", "#facebook", "ibm", "info")

ggplot(spa_data, aes(x = year, y = n, group = employer_name)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(x = "Year",
       y = "Number",
       col = "") +
  theme_classic()+
  geom_line(data = subset(spa_data, employer_name %in% con),aes(col=employer_name),size=1.2)+
  theme(plot.title = element_text(size = 14),
              text = element_text(size = 12),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_manual(values = myColor, breaks = c("infosys limited", "deloitte consulting llp","amazon","facebook", "ibm"), labels = c("Infosys Limited", "Deloitte Consulting","Amazon","Facebook", "IBM")) +
  theme(legend.position = "top")

Slide 17

Data jobs in top companies


filtered_job_all <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Analyst", "Data Engineer", "Data Scientist")) %>% 
  mutate(employer_name = ifelse(str_detect(employer_name,'apple'), 'Apple',
                          ifelse(str_detect(employer_name,'microsoft'), 'Microsoft',
                          ifelse(str_detect(employer_name,'amazon'),'Amazon',
                          ifelse(str_detect(employer_name,'facebook'),'Facebook',
                          ifelse(str_detect(employer_name,'google'),'Google',
                          ifelse(str_detect(employer_name, 'ibm'),'IBM',employer_name))))))) 
  

#IBM

filtered_job_all %>% 
  filter(employer_name == 'IBM') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

NA
NA

Infosys


filtered_job_all %>% 
  filter(str_detect(employer_name, 'infosys')) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Microsoft

filtered_job_all %>% 
  filter(employer_name == 'Microsoft') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Amazon

filtered_job_all %>% 
  filter(employer_name == 'Amazon') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Deloitte

filtered_job_all %>% 
  filter(str_detect(employer_name, "deloitte")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Facebook

filtered_job_all %>% 
  filter(str_detect(employer_name, "Facebook")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Apple

filtered_job_all %>% 
  filter(str_detect(employer_name, "Apple")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Facebook

h1b_facebook <- h1b_df %>% 
  filter(employer_name == 'facebook') %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
  
con=c("Data Scientist","software engineer","Data Engineer",'research scientist')
ggplot(h1b_facebook, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Facebook",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_facebook, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))+
  scale_color_discrete(labels = c("Data Engineer", "Data Scientist", "Research Scientist","Software Engineer"))

Amazon


h1b_amazon <- h1b_df %>% 
  filter(str_detect(employer_name,'amazon')) %>% 
  ungroup(data_job_title) %>% 
  mutate(job_title=ifelse(str_detect(data_job_title,'software development engineer'), 'software development engineer', 
                   ifelse(str_detect(data_job_title,'technical program manager'), 'technical program manager',data_job_title)))%>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Data Scientist","software development engineer","business analyst","Data Engineer","technical program manager")
ggplot(h1b_amazon, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Amazon",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_amazon, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Business Analyst", "Data Engineer", "Data Scientist","Software Development Engineer","Technical Program Manager"))

Microsoft

h1b_micro <- h1b_df %>% 
  filter(str_detect(employer_name,'microsoft')) %>% 
  ungroup(data_job_title) %>% 
  mutate(job_title=ifelse(str_detect(data_job_title,'software engineer|software development engineer'), 'software engineer', 
                   ifelse(str_detect(data_job_title,'program manager'), 'program manager',data_job_title))) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
  
con=c("Data Scientist","software engineer","program manager")
ggplot(h1b_micro, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Microsoft",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_micro, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Data Scientist","Program Manager","Software Engineer"))

Google

h1b_google <- h1b_df %>% 
  filter(str_detect(employer_name,'google')) 
  
h1b_google <- h1b_google %>% 
  ungroup(data_job_title) %>% 
  mutate(data_job_title=ifelse(str_detect(data_job_title,'software engineer'), 'software engineer',
              ifelse(str_detect(data_job_title,'hardware engineer'), 'hardware engineer',data_job_title))) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Data Scientist","software engineer","program manager","product manager","business analyst")
ggplot(h1b_google, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Google",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_google, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Business Analyst", "Data Scientist","Product Manager","Program Manager", "Software Engineer"))

IBM

h1b_ibm <- h1b_df %>% 
  filter(str_detect(employer_name,'ibm')) 
  
h1b_ibm <- h1b_ibm %>% 
  ungroup(data_job_title) %>% 
  mutate(data_job_title=ifelse(str_detect(data_job_title,'software engineer'), 'software engineer',
              ifelse(str_detect(data_job_title,'hardware engineer'), 'hardware engineer',data_job_title))) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("consultant","application developer","it specialist","software engineer","project manager")
ggplot(h1b_ibm, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in IBM",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_ibm, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))

Uber

h1b_uber <- h1b_df %>% 
  filter(str_detect(employer_name,'uber')) %>% 
  ungroup(data_job_title) %>% 
  mutate(data_job_title=ifelse(str_detect(data_job_title,'software engineer'), 'Software Engineer', 
        data_job_title)) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Software Engineer","Data Scientist","Data Analyst")
ggplot(h1b_uber, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Uber",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_uber, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))

Alluvia

filtered_job <- DATA %>% 
  filter(year == 2018) %>% 
  filter(data_job_title %in% c("Business Analyst","Data Analyst","Data Engineer", "Data Scientist"))


top_10_state <- filtered_job %>% 
  group_by(worksite_state_abb) %>% 
  summarise(count = n()) %>% 
  arrange(desc(count)) %>% 
  slice(1:10) 

flows <- filtered_job %>% 
  filter(worksite_state_abb %in% top_10_state$worksite_state_abb) %>% 
  group_by(data_job_title,
           worksite_state_abb) %>%
  summarise(count = n())


ggplot(flows, aes(y =count, axis1=data_job_title, axis2=worksite_state_abb)) +
  geom_alluvium(aes(fill = data_job_title)) +
  geom_stratum(width = 1/8, fill = "black", color = "grey", alpha = 0.8) +
  geom_label(stat = "stratum", label.strata = TRUE) +
  theme_classic()+
  theme(legend.position = "bottom") +
  scale_fill_manual(values = c("#6ba8a9","#465881", "#999999", "#FC2967"))

bar plot:stem program in different job titles

DATA %>% 
  mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>% 
  filter(year == 2018) %>% 
  filter(stem == 1) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  ggbarplot("job_title", "n", fill = "#00B2E4", color = "white", alpha = 0.8, sort.val = "asc", orientation = "horiz") %>% 
  labs(title = "stem program")
[[1]]

$title
[1] "stem program"

attr(,"class")
[1] "labels"

MAP - data job with the highest number in each city

ggplot(points) + 
  geom_sf(data = state_maps, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 0.1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.position = c(0,0), legend.justification = c(0,0))+
  labs(x = "", y = "", title = "")

ggplot(points_ca) + 
  geom_sf(data = state_maps_ca, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

ggplot(points_northeast) + 
  geom_sf(data = state_maps_northeast, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

ggplot(points_midwest) + 
  geom_sf(data = state_maps_midwest, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

ggplot(points_tn) + 
  geom_sf(data = state_maps_tn, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCiMgU0VDVElPTiAxOiBCQUNLR1JPVU5ECiMgU0xJREUgNzogTUFQCgpgYGB7cn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgick1hcHMuaHRtbCIpCmBgYAoKIyBTRUNUSU9OIDI6IFNURU0KIyBTTElERSA5OiBTdGVtIGFuZCBub24tc3RlbSBoaXN0b2dyYW0KYGBge3IgZmlnLmhlaWdodD0zLjUsIGZpZy53aWR0aD0zfQpEQVRBICU+JQogIGdyb3VwX2J5KHllYXIsIHN0ZW0pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuLCBmaWxsID0gYXMuZmFjdG9yKHN0ZW0pKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBGQUxTRSksIGFscGhhID0gMC44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgbGFicyh5PSJOdW1iZXIiLCB4PSJcbiBZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHgvMTAwMCwgJ0snKX0pICsgCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCiMgU0xJREUgMTA6IFNURU0gYW5kIG5vbi1TVEVNIGJveHBsb3Q6ICJQcmV2YWlsaW5nIHdhZ2UgYm94cGxvdCB0aHJvdWdob3V0IHllYXJzIgpgYGB7cn0KREFUQSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNjAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IoeWVhciksIHkgPSBwcmV2YWlsaW5nX3dhZ2UpKSArCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWFzLmZhY3RvcihzdGVtKSksIG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGE9MC45LCBjb2xvciA9ICJ3aGl0ZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogbGFicyh4ID0gIlxuIFByZXZhaWxpbmcgd2FnZSAoJCkiLCB5ID0gIkRlbnNpdHkgXG4iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4IC8gMTAwMCwgIksiKX0pICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDQwMDAwLCAxMDAwMDApKQpgYGAKCgojIFNMSURFIDExOiBTdGVtIGFuZCBub24tc3RlbSBwcmV2YWlsaW5nIHdhZ2UgZGlzdHJpYnV0aW9uIGluIDIwMTgKYGBge3J9CkRBVEEgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgZmlsdGVyKHByZXZhaWxpbmdfd2FnZSA+PSAwICYgcHJldmFpbGluZ193YWdlIDw9IDQwMDAwMCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHByZXZhaWxpbmdfd2FnZSwgY29sb3IgPSBhcy5mYWN0b3Ioc3RlbSksIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpKSArCiAgZ2VvbV9kZW5zaXR5KGFkanVzdCA9IDIsIGFscGhhID0gMC43KSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICJcbiBQcmV2YWlsaW5nIHdhZ2UgKCQpIiwgeSA9IGV4cHJlc3Npb24oRGVuc2l0eX4oMTBeey0zfSkpLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgcHJldmFpbGluZyB3YWdlIGluIDIwMTgiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4LzEwMDAsICdLJyl9KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4ICogMTAwMCwgIiIpfSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKCiMgU0xJREUgMTIgQU5EIDEzOiBiYXIgcGxvdDogc3RlbSBqb2JzCmBgYHtyfQpkdCA8LSBEQVRBICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYnVzaW5lc3MiKSYgKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdCIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiaW50ZWxsaWdlbmNlIikpICwgImJ1c2luZXNzIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZW5naW5lZXIiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIndhcmVob3VzZSIpKSwgImRhdGEgZW5naW5lZXIiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJzY2llbnRpc3QiKSwgImRhdGEgc2NpZW50aXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxhbmFseXRpY3MiKSwgImRhdGEgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibWFjaGluZXxkZWVwIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibGVhcm5pbmciKSwgImRlZXAgbGVhcm5pbmcgJiBtYWNoaW5lIGxlYXJuaW5nIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJwcm9kdWN0IikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8ZW5naW5lZXJ8ZGF0YSIpLCAiZGF0YSBwcm9kdWN0IGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNlbmlvciBzeXN0ZW1zIGFuYWx5c3QgamM2MCIpLCAic2VuaW9yIHN5c3RlbXMgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBmaWx0ZXIoc3RlbSA9PSAxKQojIAojIGR0ICU+JSAKIyAgIGZpbHRlcih5ZWFyID09IDIwMTcpICU+JSAKIyAgIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAojICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQojICAgYXJyYW5nZSgtbikgJT4lIAojICAgc2xpY2UoMToyMCkgJT4lIAojICAgbXV0YXRlKGNhdCA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8ZGF0YSIpLCAiZGF0YSIsICJub24tZGF0YSIpKSAlPiUKIyAgIGFycmFuZ2UobikgJT4lIAojICAgZ2diYXJwbG90KCJqb2JfdGl0bGUiLCAibiIsIGZpbGwgPSAiY2F0IiwgcGFsZXR0ZSA9IGMoIiNGQzI5NjciLCAiIzAwQjJFNCIpLCBhbHBoYSA9IDAuOCwgb3JpZW50YXRpb24gPSAiaG9yaXoiLCBjb2xvciA9ICJ3aGl0ZSIpICsKIyAgIGxhYnMoeSA9ICJOdW1iZXIgb2YgQXBsaWNhdGlvbnMiLCB4ID0gIkpvYiBUaXRsZXMiKQoKZHQgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQogIGFycmFuZ2UobikgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gImNhdCIsIHBhbGV0dGUgPSBjKCIjRkMyOTY3IiwgIiMwMEIyRTQiKSwgYWxwaGEgPSAwLjgsIG9yaWVudGF0aW9uID0gImhvcml6IiwgY29sb3IgPSAid2hpdGUiKSArCiAgbGFicyh5ID0gIk51bWJlciBvZiBBcGxpY2F0aW9ucyIsIHggPSAiSm9iIFRpdGxlcyIpKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiCiAgKQoKCiMgb3JpZ2luYWwKZHQgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQogIGFycmFuZ2UobikgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gIiMwMEIyRTQiLCBhbHBoYSA9IDAuOCwgb3JpZW50YXRpb24gPSAiaG9yaXoiLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikKYGBgCgojIFNsaWRlIDE1CmBgYHtyLGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTR9CmR0IDwtIERBVEEgJT4lIAogIGZpbHRlcihkYXRhX2pvYl90aXRsZSAlaW4lIGMoIkJ1c2luZXNzIEFuYWx5c3QiLCJEYXRhIEVuZ2luZWVyIiwiRGF0YSBBbmFseXN0IiwgIkRhdGEgU2NpZW50aXN0IikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgYXJyYW5nZSgtbikgCgpwMSA8LSBkdCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICJBcHBsaWNhdGlvbnMgRGF0YSByZWxhdGVkIGpvYnMiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKyAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpwMQpgYGAKCiMgU2xpZGUgMTcKYGBge3J9Cgp0b3BfY29tIDwtIERBVEEgJT4lIAogIGZpbHRlcihkYXRhX2pvYl90aXRsZSAlaW4lIGMoIkJ1c2luZXNzIEFuYWx5c3QiLCAiRGF0YSBBbmFseXN0IiwgIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiKSkgJT4lCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICB1bmdyb3VwKCkKCnRvcF9jb20gPC10b3BfY29tJGVtcGxveWVyX25hbWUgCgpzcGFfZGF0YSA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSAlaW4lIHRvcF9jb20pICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSAhPSAiY2FwZ2VtaW5pIGFtZXJpY2EgaW5jIikgJT4lIAogIGZpbHRlcihkYXRhX2pvYl90aXRsZSAlaW4lIGMoIkJ1c2luZXNzIEFuYWx5c3QiLCAiRGF0YSBBbmFseXN0IiwgIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiKSkgJT4lCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAKCmNvbj1jKCJpbmZvc3lzIGxpbWl0ZWQiLCAiZGVsb2l0dGUgY29uc3VsdGluZyBsbHAiLCJhbWF6b24iLCJmYWNlYm9vayIsICJpYm0iKQpteUNvbG9yIDwtIGMoIiM0NjU4ODEiLCAiI0ZGQjZDMSIsICIjMDA5MDllIiwgIiMwMEIyRTQiLCAiI0ZDMjk2NyIpCgojIGMoYW1hem9uLCAiZGVsb2l0dGUiLCAiI2ZhY2Vib29rIiwgImlibSIsICJpbmZvIikKCmdncGxvdChzcGFfZGF0YSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBlbXBsb3llcl9uYW1lKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAiIikgKwogIHRoZW1lX2NsYXNzaWMoKSsKICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChzcGFfZGF0YSwgZW1wbG95ZXJfbmFtZSAlaW4lIGNvbiksYWVzKGNvbD1lbXBsb3llcl9uYW1lKSxzaXplPTEuMikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteUNvbG9yLCBicmVha3MgPSBjKCJpbmZvc3lzIGxpbWl0ZWQiLCAiZGVsb2l0dGUgY29uc3VsdGluZyBsbHAiLCJhbWF6b24iLCJmYWNlYm9vayIsICJpYm0iKSwgbGFiZWxzID0gYygiSW5mb3N5cyBMaW1pdGVkIiwgIkRlbG9pdHRlIENvbnN1bHRpbmciLCJBbWF6b24iLCJGYWNlYm9vayIsICJJQk0iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKYGBgCgoKIyBTbGlkZSAxNwojIFRvcCBUZWNoIENvbXBhbmllcyBhbmQgVGhlaXIgVHJlbmRzCmBgYHtyfQpzb2NfdG9wX3RlY2ggPC0gYygiQXBwbGUiLAogICAgICAgICAgICAgICAgICAiTWljcm9zb2Z0IiwKICAgICAgICAgICAgICAgICAgIkFtYXpvbiIsCiAgICAgICAgICAgICAgICAgICJGYWNlYm9vayIsCiAgICAgICAgICAgICAgICAgICJHb29nbGUiLAogICAgICAgICAgICAgICAgICAiSUJNIiwKICAgICAgICAgICAgICAgICAgIkNpc2NvIikKCgpoMWJfZGYgJT4lIAogIGZpbHRlcihjYXNlX3N0YXR1cyA9PSAgImNlcnRpZmllZCIpICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJidXNpbmVzcyIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSkgLCAiQnVzaW5lc3MgQW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLCAiRGF0YSBFbmdpbmVlciIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpICYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJzY2llbnRpc3QiKSwgIkRhdGEgU2NpZW50aXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKSwgIkRhdGEgQW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibWFjaGluZXxkZWVwIikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksICJEZWVwIExlYXJuaW5nICYgTWFjaGluZSBMZWFybmluZyIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpICYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGVuZ2luZWVyfGRhdGEiKSwgIkRhdGEgUHJvZHVjdCBBbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIGZpbHRlcihqb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsIkRlZXAgTGVhcm5pbmcgJiBNYWNoaW5lIExlYXJuaW5nIiwiRGF0YSBBbmFseXN0IiwgIkRhdGEgU2NpZW50aXN0IiwgIkRhdGEgUHJvZHVjdCBBbmFseXN0IikpICU+JQogIG11dGF0ZShlbXBsb3llcl9uYW1lID0gaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYXBwbGUnKSwgJ0FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdtaWNyb3NvZnQnKSwgJ01pY3Jvc29mdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJyksJ0FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnY2lzY28gc3lzJyksJ0Npc2NvJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdmYWNlYm9vaycpLCdGYWNlYm9vaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZ29vZ2xlJyksJ0dvb2dsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2libScpLCdJQk0nLCdubycpKSkpKSkpKSAlPiUgCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZSh0b3QgPSBuKCkpICU+JSAKICBmaWx0ZXIoIWVtcGxveWVyX25hbWUgJWluJSBjKCJubyIsIE5BKSkgJT4lIAogIHVuZ3JvdXAoKSU+JSAKICBnZ3Bsb3QoKSsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gdG90LCBjb2xvciA9IGVtcGxveWVyX25hbWUpLCBzaXplID0gMS4wNSkrCiAgbGFicyggeSA9ICJOdW1iZXIgb2YgQXBwbGljYXRpb25zIiwgeCA9ICJZZWFyIiwgY29sb3IgPSAiRW1wbG95ZXIiKSsKICB0aGVtZV9idygpCgoKYGBgCgoKIyBEYXRhIGpvYnMgaW4gdG9wIGNvbXBhbmllcyAKCmBgYHtyfQoKZmlsdGVyZWRfam9iX2FsbCA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBBbmFseXN0IiwgIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiKSkgJT4lIAogIG11dGF0ZShlbXBsb3llcl9uYW1lID0gaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYXBwbGUnKSwgJ0FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdtaWNyb3NvZnQnKSwgJ01pY3Jvc29mdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJyksJ0FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZmFjZWJvb2snKSwnRmFjZWJvb2snLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2dvb2dsZScpLCdHb29nbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSwnSUJNJyxlbXBsb3llcl9uYW1lKSkpKSkpKSAKICAKYGBgCgojSUJNCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnSUJNJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKCgpgYGAKCiMgSW5mb3N5cwpgYGB7cn0KCmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpbmZvc3lzJykpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgpgYGAKCiMgTWljcm9zb2Z0CmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnTWljcm9zb2Z0JykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIEFtYXpvbgpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ0FtYXpvbicpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBEZWxvaXR0ZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgImRlbG9pdHRlIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBGYWNlYm9vawpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkZhY2Vib29rIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBBcHBsZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkFwcGxlIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKCiMjIEZhY2Vib29rCgpgYGB7cn0KaDFiX2ZhY2Vib29rIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ2ZhY2Vib29rJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQogIApgYGAKCgoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwiRGF0YSBFbmdpbmVlciIsJ3Jlc2VhcmNoIHNjaWVudGlzdCcpCmdncGxvdChoMWJfZmFjZWJvb2ssIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIEZhY2Vib29rIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfZmFjZWJvb2ssIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiwgIlJlc2VhcmNoIFNjaWVudGlzdCIsIlNvZnR3YXJlIEVuZ2luZWVyIikpCgpgYGAKCiMjIEFtYXpvbgoKYGBge3J9CgpoMWJfYW1hem9uIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJykpICU+JSAKICB1bmdyb3VwKGRhdGFfam9iX3RpdGxlKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnc29mdHdhcmUgZGV2ZWxvcG1lbnQgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGRldmVsb3BtZW50IGVuZ2luZWVyJywgCiAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwndGVjaG5pY2FsIHByb2dyYW0gbWFuYWdlcicpLCAndGVjaG5pY2FsIHByb2dyYW0gbWFuYWdlcicsZGF0YV9qb2JfdGl0bGUpKSklPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCgpgYGAKCmBgYHtyfQpjb249YygiRGF0YSBTY2llbnRpc3QiLCJzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbmdpbmVlciIsImJ1c2luZXNzIGFuYWx5c3QiLCJEYXRhIEVuZ2luZWVyIiwidGVjaG5pY2FsIHByb2dyYW0gbWFuYWdlciIpCmdncGxvdChoMWJfYW1hem9uLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBBbWF6b24iLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl9hbWF6b24sIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiwiU29mdHdhcmUgRGV2ZWxvcG1lbnQgRW5naW5lZXIiLCJUZWNobmljYWwgUHJvZ3JhbSBNYW5hZ2VyIikpCmBgYAoKCiMjIE1pY3Jvc29mdAoKYGBge3J9CmgxYl9taWNybyA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ21pY3Jvc29mdCcpKSAlPiUgCiAgdW5ncm91cChkYXRhX2pvYl90aXRsZSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3NvZnR3YXJlIGVuZ2luZWVyfHNvZnR3YXJlIGRldmVsb3BtZW50IGVuZ2luZWVyJyksICdzb2Z0d2FyZSBlbmdpbmVlcicsIAogICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3Byb2dyYW0gbWFuYWdlcicpLCAncHJvZ3JhbSBtYW5hZ2VyJyxkYXRhX2pvYl90aXRsZSkpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCiAgCmBgYAoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwicHJvZ3JhbSBtYW5hZ2VyIikKZ2dwbG90KGgxYl9taWNybywgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gTWljcm9zb2Z0IiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfbWljcm8sIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiRGF0YSBTY2llbnRpc3QiLCJQcm9ncmFtIE1hbmFnZXIiLCJTb2Z0d2FyZSBFbmdpbmVlciIpKQpgYGAKCgojIyBHb29nbGUKCmBgYHtyfQpoMWJfZ29vZ2xlIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZ29vZ2xlJykpIAogIApgYGAKCmBgYHtyfQpoMWJfZ29vZ2xlIDwtIGgxYl9nb29nbGUgJT4lIAogIHVuZ3JvdXAoZGF0YV9qb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3NvZnR3YXJlIGVuZ2luZWVyJyksICdzb2Z0d2FyZSBlbmdpbmVlcicsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ2hhcmR3YXJlIGVuZ2luZWVyJyksICdoYXJkd2FyZSBlbmdpbmVlcicsZGF0YV9qb2JfdGl0bGUpKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQpgYGAKCmBgYHtyfQpjb249YygiRGF0YSBTY2llbnRpc3QiLCJzb2Z0d2FyZSBlbmdpbmVlciIsInByb2dyYW0gbWFuYWdlciIsInByb2R1Y3QgbWFuYWdlciIsImJ1c2luZXNzIGFuYWx5c3QiKQpnZ3Bsb3QoaDFiX2dvb2dsZSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gR29vZ2xlIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfZ29vZ2xlLCBkYXRhX2pvYl90aXRsZSAlaW4lIGNvbiksYWVzKGNvbD1kYXRhX2pvYl90aXRsZSksc2l6ZT0wLjcpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiLCAiRGF0YSBTY2llbnRpc3QiLCJQcm9kdWN0IE1hbmFnZXIiLCJQcm9ncmFtIE1hbmFnZXIiLCAiU29mdHdhcmUgRW5naW5lZXIiKSkKYGBgCgoKIyMgSUJNIAoKYGBge3J9CmgxYl9pYm0gPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdpYm0nKSkgCiAgCmBgYAoKYGBge3J9CmgxYl9pYm0gPC0gaDFiX2libSAlPiUgCiAgdW5ncm91cChkYXRhX2pvYl90aXRsZSkgJT4lIAogIG11dGF0ZShkYXRhX2pvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGVuZ2luZWVyJywKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnaGFyZHdhcmUgZW5naW5lZXInKSwgJ2hhcmR3YXJlIGVuZ2luZWVyJyxkYXRhX2pvYl90aXRsZSkpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3J9CmNvbj1jKCJjb25zdWx0YW50IiwiYXBwbGljYXRpb24gZGV2ZWxvcGVyIiwiaXQgc3BlY2lhbGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwicHJvamVjdCBtYW5hZ2VyIikKZ2dwbG90KGgxYl9pYm0sIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIElCTSIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX2libSwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpCmBgYAoKIyMgVWJlcgoKYGBge3J9CmgxYl91YmVyIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwndWJlcicpKSAlPiUgCiAgdW5ncm91cChkYXRhX2pvYl90aXRsZSkgJT4lIAogIG11dGF0ZShkYXRhX2pvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXInKSwgJ1NvZnR3YXJlIEVuZ2luZWVyJywgCiAgICAgICAgZGF0YV9qb2JfdGl0bGUpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3J9CmNvbj1jKCJTb2Z0d2FyZSBFbmdpbmVlciIsIkRhdGEgU2NpZW50aXN0IiwiRGF0YSBBbmFseXN0IikKZ2dwbG90KGgxYl91YmVyLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBVYmVyIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfdWJlciwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpCmBgYAoKCiMjIEFsbHV2aWEKYGBge3J9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsIkRhdGEgQW5hbHlzdCIsIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiKSkKCgp0b3BfMTBfc3RhdGUgPC0gZmlsdGVyZWRfam9iICU+JSAKICBncm91cF9ieSh3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUgCiAgc2xpY2UoMToxMCkgCgpmbG93cyA8LSBmaWx0ZXJlZF9qb2IgJT4lIAogIGZpbHRlcih3b3Jrc2l0ZV9zdGF0ZV9hYmIgJWluJSB0b3BfMTBfc3RhdGUkd29ya3NpdGVfc3RhdGVfYWJiKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsCiAgICAgICAgICAgd29ya3NpdGVfc3RhdGVfYWJiKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpCgoKZ2dwbG90KGZsb3dzLCBhZXMoeSA9Y291bnQsIGF4aXMxPWRhdGFfam9iX3RpdGxlLCBheGlzMj13b3Jrc2l0ZV9zdGF0ZV9hYmIpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fc3RyYXR1bSh3aWR0aCA9IDEvOCwgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImdyZXkiLCBhbHBoYSA9IDAuOCkgKwogIGdlb21fbGFiZWwoc3RhdCA9ICJzdHJhdHVtIiwgbGFiZWwuc3RyYXRhID0gVFJVRSkgKwogIHRoZW1lX2NsYXNzaWMoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM2YmE4YTkiLCIjNDY1ODgxIiwgIiM5OTk5OTkiLCAiI0ZDMjk2NyIpKQpgYGAKCgojIyBiYXIgcGxvdDpzdGVtIHByb2dyYW0gaW4gZGlmZmVyZW50IGpvYiB0aXRsZXMKYGBge3J9CkRBVEEgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJidXNpbmVzcyIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSkgLCAiYnVzaW5lc3MgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLCAiZGF0YSBlbmdpbmVlciIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLCAiZGF0YSBzY2llbnRpc3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLCAiZGF0YSBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJsZWFybmluZyIpLCAiZGVlcCBsZWFybmluZyAmIG1hY2hpbmUgbGVhcm5pbmciLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksICJkYXRhIHByb2R1Y3QgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUgCiAgZmlsdGVyKHN0ZW0gPT0gMSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gIiMwMEIyRTQiLCBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44LCBzb3J0LnZhbCA9ICJhc2MiLCBvcmllbnRhdGlvbiA9ICJob3JpeiIpICU+JSAKICBsYWJzKHRpdGxlID0gInN0ZW0gcHJvZ3JhbSIpCmBgYAoKIyBNQVAgLSBkYXRhIGpvYiB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBpbiBlYWNoIGNpdHkgCmBgYHtyfQpnZ3Bsb3QocG9pbnRzKSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHMsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uLDEwMCksIHkgPSBqaXR0ZXIobGF0LDEwMCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAwLjEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkpKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfY2EpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwc19jYSwgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImxpZ2h0Z3JleSIsYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGppdHRlcihsb24pLCB5ID0gaml0dGVyKGxhdCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c19ub3J0aGVhc3QpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwc19ub3J0aGVhc3QsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uKSwgeSA9IGppdHRlcihsYXQpLCBjb2xvciA9IG1heF9qb2IpLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICAgICAgICApKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfbWlkd2VzdCkgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX21pZHdlc3QsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uLDEwMCksIHkgPSBqaXR0ZXIobGF0LDEwMCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c190bikgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX3RuLCBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAibGlnaHRncmV5IixhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaml0dGVyKGxvbiksIHkgPSBqaXR0ZXIobGF0KSwgY29sb3IgPSBtYXhfam9iKSwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiKQpgYGA=